using Universal.Domain.Events.Users;

namespace Universal.Domain.Entities.App;

/// <summary>
/// 用户实体类
/// </summary>
public class AppUser : EntityBase
{
    // 用户名，唯一且不能为空
    public string Username { get; set; } = string.Empty;

    // 密码，不能为空
    public string Password { get; set; } = string.Empty;

    // 昵称，可以为空
    public string? Nickname { get; set; } = string.Empty;

    // 个人介绍，可以为空
    public string? Description { get; set; } = string.Empty;

    // 登录失败次数，默认为 0
    public int LoginAttempts { get; set; } = 0;

    // 账号锁定截止时间，可以为空
    public DateTime? AccountLockedUntil { get; set; }

    // 用户最后一次尝试登录时间，可以为空
    public DateTime? LastLoginAttempt { get; set; }

    // 邮箱，唯一且不能为空
    public string Email { get; set; } = string.Empty;

    // 手机号码，可以为空
    public string Phone { get; set; } = string.Empty;

    // 头像链接，可以为空
    public string Avatar { get; set; } = string.Empty;

    // 刷新令牌，可以为空
    public string? RefreshToken { get; set; }

    // 刷新令牌过期时间，可以为空
    public DateTime? RefreshTokenExpiry { get; set; }


    //一个用户拥有多个角色
    public ICollection<AppRole> Roles { get; set; } = new List<AppRole>();
    public ICollection<AppFile> Files { get; set; } = new List<AppFile>();
    public ICollection<AppArticle> Articles { get; set; } = new List<AppArticle>();

    public bool AssignRole(AppRole role)
    {
        //如果不包含则添加角色
        if (!Roles.Contains(role))
        {
            Roles.Add(role);
            return true;
        }
        return false;
    }

    public bool RemoveRole(AppRole role)
    {
        //如果包含则移除角色
        if (Roles.Contains(role))
        {
            Roles.Remove(role);
            return true;
        }
        return false;
    }


    // 添加注册方法，触发领域事件，注册后，会自动触发用户注册事件
    public void Register()
    {
        // 添加领域事件
        AddDomainEvent(new UserRegisteredDomainEvent(Id, Username));
    }

}